==========================================================================
GTE.txt - Documentation & Explanation.
==========================================================================

Disclaimer.
--------------------------------------------------------------------------
This document is a collection of all info on the GTE i could find and my
own notes. Most of this is the result of experiment, so not all info might
be correct. This document is most probably not complete, and not all
capabilities and quirks of the GTE are documented. No responsibility is
taken for anything that might occur using the information in this document.

--------------------------------------------------------------------------
Introduction.
--------------------------------------------------------------------------
The Geometry Transformation Engine (GTE) is the heart of all 3d
calculations on the psx. The GTE has specialised functions for perspective
transformations, light sourcing and the like, and is much faster than the
CPU on these operations. It is mounted as the second coprocessor and as
such has no physical address in the memory of the psx. All control is done
through special instructions.

--------------------------------------------------------------------------
Basic mathematics
--------------------------------------------------------------------------
The GTE is basicly an engine for vector mathematics, so some knowledge
of that area is vital for correct usage of the GTE. I will not delve to
deeply in that area, as that's beyond the scope of this text, but i'll
introduce some concepts.

The basic representation of a point(vertex) in 3d space is through a vector
of the sort [X,Y,Z]. In GTE operation there's basicly two kinds of these,
vectors of variable length and vectors of a unit length of 1.0, called
normal vectors. The first is used to decribe a locations and translations
in 3d space, the second to describe a direction.

Rotation of vertices is performed by multiplying the vector of the vertex
with a rotation matrix. The rotation matrix is a 3x3 matrix consisting of
3 normal vectors which are orthogonal to each other. (It's actually the
matrix which describes the coordinate system in which the vertex is located
in relation to the unit coordinate system. See a maths book for more
details.) This matrix is derived from rotation angles as follows:

(s? = sin(?), c? = cos(?))

Rotation angle A   Rotation angle B    Rotation angle C
about X axis:      about Y axis:       about Z axis:

|  1   0   0|       | cB   0  sB|        | cC -sC   0|
|  0  cA -sA|       |  0   1   0|        | sC  cC   0|
|  0  sA  cA|       |-sB   0  cB|        |  0   0   1|

Rotation about multiple axis can be done by multiplying these matrices
with eachother. Note that the order in which this multiplication is done
*IS* important. The GTE has no sine or cosine functions, so the calculation
of these must be done by the CPU.

Translation is the simple addition of two vectors, relocating the vertex
within its current coordinate system. Needless to say the order in which
translation and rotation occur for a vector is important.

--------------------------------------------------------------------------
Brief Function descriptions
--------------------------------------------------------------------------
RTPS/RTPT         Rotate, translate and perpective transformation.

These two functions perform the final 3d calculations on one or three
vertices at once. The points are first multiplied with a rotation matrix(R),
and after that translated(TR). Finally a perspective transformation is
applied, which results in 2d screen coordinates. It also returns an
interpolation value to be used with the various depth cueing instructions.
--------------------------------------------------------------------------
MVMVA             Matrix & Vector multiplication and addition.

Multiplies a vector with either the rotation matrix, the light matrix or
the color matrix and then adds the translation vector or background color
vector.
--------------------------------------------------------------------------
DCPL              Depth cue light color

First calculates a color from a light vector(normal vector of a plane
multiplied with the light matrix and zero limited) and a provided RGB value.
Then performs depth cueing by interpolating between the far color vector and
the newfound color.
--------------------------------------------------------------------------
DPCS/DPCT         Depth cue single/triple

Performs depth cueing by interpolating between a color and the far color
vector on one or three colors.
--------------------------------------------------------------------------
INTPL             Interpolation

Interpolates between a vector and the far color vector.
--------------------------------------------------------------------------
SQR               Square

Calculates the square of a vector.
--------------------------------------------------------------------------
NCS/NCT           Normal Color

Calculates a color from the normal of a point or plane and the light
sources and colors. The basic color of the plane or point the normal
refers to is assumed to be white.
--------------------------------------------------------------------------
NCDS/NCDT         Normal Color Depth Cue.

Same as NCS/NCT but also performs depth cueing (like DPCS/DPCT)
--------------------------------------------------------------------------
NCCS/NCCT

Same NCS/NCT, but the base color of the plane or point is taken into
account.
--------------------------------------------------------------------------
CDP

A color is calculated from a light vector (base color is assumed to be
white) and depth cueing is performed (like DPCS).
--------------------------------------------------------------------------
CC

A color is calculated from a light vector and a base color.
--------------------------------------------------------------------------
NCLIP

Calculates the outer product of three 2d points.(ie. 3 vertices which
define a plane after projection.)

The 3 vertices should be stored clockwise according to the visual point:

          Z+
         /
       /____ X+
       |
       |
        Y+

If this is so, the result of this function will be negative if we are
facing the backside of the plane.
--------------------------------------------------------------------------
AVSZ3/AVSZ4

Adds 3 or 4 z values together and multplies them by a fixed point value.
This value is normally chosen so that this function returns the average
of the z values (usually further divided by 2 or 4 for easy adding to the
OT)
--------------------------------------------------------------------------
OP

Calculates the outer product of 2 vectors.
--------------------------------------------------------------------------
GPF

Multiplies 2 vectors. Also returns the result as 24bit rgb value.
--------------------------------------------------------------------------
GPL

Multiplies a vector with a scalar and adds the result to another vector.
Also returns the result as 24bit rgb value.

--------------------------------------------------------------------------
GTE Operation.
--------------------------------------------------------------------------
Instructions.
--------------------------------------------------------------------------
The CPU has six special load and store instructions for the GTE registers,
and an instruction to issue commands to the coprocessor.

rt        CPU register 0-31
gd        GTE data register 0-31
gc        GTE control register 0-31
imm       16 bit immediate value
base      CPU register 0-31
imm(base) address pointed to by base + imm.
b25       25 bit wide data field.

LWC2  gd, imm(base)   stores value at imm(base) in gte data register gd.
SWC2  gd, imm(base)   stores gte data register at imm(base).
MTC2  rt, gd          stores register rt in GTE data register gd.
MFC2  rt, gd          stores GTE data register gd in register rt.
CTC2  rt, gc          stores register rt in GTE control register gc.
CFC2  rt, gc          stores GTE control register in register rt.

COP2  b25             Issues a GTE command.

Gte load and store instructions have a delay of 2 instructions, for any
gte commands or operations accessing that register.

--------------------------------------------------------------------------
Registers.
--------------------------------------------------------------------------
The GTE has 32 data registers, and 32 control registers,each 32 bits wide.
The following list describes their common use and format. Note in some
functions format is different from the one that's given here. The numbers
in the format fields are the signed, integer and fractional parts of the
field. So 1,3,12 means signed(1 bit), 3 bits integral part, 12 bits
fractional part.

Control registers:
No. Name    |31-24 23-16|15-08 07-01| Description
 0  R11R12  |R12 1, 3,12|R11 1, 3,12| Rotation matrix elements 11, 12
 1  R13R21  |R21 1, 3,12|R13 1, 3,12| Rotation matrix elements 13, 21
 2  R22R23  |R23 1, 3,12|R22 1, 3,12| Rotation matrix elements 22, 23
 3  R31R32  |R32 1, 3,12|R31 1, 3,12| Rotation matrix elements 31, 32
 4  R33     |          0|R33 1, 3,12| Rotation matrix element 33
 5  TRX     |TRX 1,31, 0            | Translation vector X
 6  TRY     |TRY 1,31, 0            | Translation vector Y
 7  TRZ     |TRZ 1,31, 0            | Translation vector Z
 8  L11L12  |L12 1, 3,12|L11 1, 3,12| Light source matrix elements 11, 12
 9  L13L21  |L21 1, 3,12|L13 1, 3,12| Light source matrix elements 13, 21
10  L22L23  |L23 1, 3,12|L22 1, 3,12| Light source matrix elements 22, 23
11  L31L32  |L32 1, 3,12|L31 1, 3,12| Light source matrix elements 31, 32
12  L33     |          0|L33 1, 3,12| Light source matrix element 33
13  RBK     |RBK 1,19,12            | Background color red component.
14  GBK     |GBK 1,19,12            | Background color green component.
15  BBK     |RBK 1,19,12            | Background color blue component.
16  LR1LR2  |LR2 1, 3,12|LR1 1, 3,12| Light color matrix source 1&2 red comp.
17  LR3LG1  |LG1 1, 3,12|LR3 1, 3,12| Light color matrix source 3 red, 1 green
18  LG2LG3  |LG3 1, 3,12|LG2 1, 3,12| Light color matrix source 2&3 green comp.
19  LB1LB2  |LB2 1, 3,12|LB1 1, 3,12| Light color matrix source 1&2 blue comp.
20  LB3     |          0|LB3 1, 3,12| Light color matrix source 3 blue component.
21  RFC     |RFC 1,27, 4            | Far color red component.
22  GFC     |GFC 1,27, 4            | Far color green component.
23  BFC     |BFC 1,27, 4            | Far color blue component.
24  OFX     |OFX 1,15,16            | Screen offset X
25  OFY     |OFY 1,15,16            | Screen offset Y
26  H       |          0|H   0,16, 0| Projection plane distance.
27  DQA     |          0|DQA 1, 7, 8| Depth queing parameter A.(coefficient.)
28  DQB     |          0|DQB 1, 7,24| Depth queing parameter B.(offset.)
29  ZSF3    |          0|ZSF3 1,3,12| Z3 average scale factor (normally 1/3)
30  ZSF4    |          0|ZSF4 1,3,12| Z4 average scale factor (normally 1/4)
31  FLAG    |See gte funcions       | Returns any calculation errors.

Data registers:
No. Name  rw|31-24 23-16|15-08 07-01| Description
 0  VXY0  rw|VY0        |VX0        | Vector 0 X and Y. 1,3,12 or 1,15,0
 1  VZ0   rw|          0|VZ0        | Vector 0 Z.
 2  VXY1  rw|VY1        |VX1        | Vector 1 X and Y. 1,3,12 or 1,15,0
 3  VZ1   rw|          0|VZ1        | Vector 1 Z.
 4  VXY2  rw|VY2        |VX2        | Vector 2 X and Y. 1,3,12 or 1,15,0
 5  VZ2   rw|          0|VZ2        | Vector 2 Z.
 6  RGB   rw|Code |B    |G    |R    | Rgb value. Code is passed, but not used in calc.
 7  OTZ   r |           |OTZ 0,15, 0| Z Average value.
 8  IR0   rw|Sign       |IR0 1, 3,12| Intermediate value 0. *1
 9  IR1   rw|Sign       |IR0 1, 3,12| Intermediate value 1. *1
10  IR2   rw|Sign       |IR0 1, 3,12| Intermediate value 2. *1
11  IR3   rw|Sign       |IR0 1, 3,12| Intermediate value 3. *1
12  SXY0  rw|SY0 1,15, 0|SX0 1,15, 0| Screen XY coordinate fifo. *2
13  SXY1  rw|SY1 1,15, 0|SX1 1,15, 0|
14  SXY2  rw|SY2 1,15, 0|SX2 1,15, 0|
15  SXYP  rw|SYP 1,15, 0|SXP 1,15, 0|
16  SZ0   rw|          0|SZ0 0,16, 0| Screen Z fifo. *2
17  SZ1   rw|          0|SZ1 0,16, 0|
18  SZ2   rw|          0|SZ2 0,16, 0|
19  SZ3   rw|          0|SZ3 0,16, 0|
20  RGB0  rw|CD0  |B0   |G0   |R0   | Characteristic color fifo. *2
21  RGB1  rw|CD1  |B1   |G1   |R1   |
22  RGB2  rw|CD2  |B2   |G2   |R2   | CD2 is the bit pattern of currently executed function
23 (RES1)   |                       | Prohibited
24  MAC0  rw|MAC0 1,31,0            | Sum of products value 0
25  MAC1  rw|MAC1 1,31,0            | Sum of products value 1
26  MAC2  rw|MAC2 1,31,0            | Sum of products value 2
27  MAC3  rw|MAC3 1,31,0            | Sum of products value 3
28  IRGB   w|           |IB |IG |IR | *3
29  ORGB  r |           |OB |OG |OR | *4
30  LZCS   w|LZCS 1,31,0            | Leading zero count source data.*5
31  LZCR  r |LZCR 0,6,0             | Leading zero count result.*5

*1) The specified format is the format which GTE functions output to these
    registers. The input format is mostly (1,19,12)

*2) The SXYx, SZx and RGBx are first in first out registers (fifo). The last
    calculation result is stored in the last register, and previous results
    are stored in previous registers. So for example when a new SXY value
    is obtained the following happens:
    SXY0 = SXY1
    SXY1 = SXY2
    SXY2 = SXYP
    SXYP = result.

*3) IRGB:
    |31        15|14-10| 9- 5| 4- 0|
    |           0|IR   |IG   |IB   |
    When writing a value to IRGB the following happens:
    IR1 = IR format converted to (1,11,4)
    IR2 = IG format converted to (1,11,4)
    IR3 = IB format converted to (1,11,4)

*4) ORGB:
    |31        15|14-10| 9- 5| 4- 0|
    |           0|IR   |IG   |IB   |
    When writing a value to IRGB the following happens:
    IR = (IR1>>7) &$1f
    IG = (IR2>>7) &$1f
    IB = (IR3>>7) &$1f
*5) Reading LZCR returns the leading 0 count of LZCS if LZCS is positive
    and the leading 1 count of LZCS if LZCS is negative.

--------------------------------------------------------------------------
Programming Considerations.
--------------------------------------------------------------------------
Before use the GTE must be turned on. The GTE has bit 30 allocated to it in
the status register of the stystem control coprocessor (cop0). Before any
GTE instruction is used, this bit must be set.

GTE instructions and functions should not be used in
- Delay slots of jumps and branches
- Event handlers or interrupts.

If an instruction that reads a GTE register or a GTE command is executed
before the current GTE command is finished, the cpu will hold until the
instruction has finished. The number of cycles each GTE instruction takes
is in the command list.

--------------------------------------------------------------------------
Function Operation.
--------------------------------------------------------------------------
This part describes the actual calculations performed by the various GTE
functions. The first line contains the name of the function, the number
of cycles it takes and a brief description. The second line any fields that
may be set in the opcode and in the third line is the actual opcode. See
the end of the list for the fields and their descriptions. Then follows a
list of all registers which are needed in the calculation under the 'in',
and a list of registers which modified under the 'out' with a brief
description and the format of the data. Next follows the calculation which
is performed after initiating the function. The format field left is the
size in which the data is stored, the format field on the right contains
the format in which the calculation is performed. At certain points in the
calculation checks and limitations are done and their results stored in the
flag register, see the table below. They are identified with the code from
the second column of the table directly followed by square brackets
enclosing the part of the calculation on which the check is performed. The
additional Lm_ identifier means the value is limited to the bottom or
ceiling of the check if it exceeds the boundary.

bit      description
31       Checksum.
30  A1   Result larger than 43 bits and positive
29  A2   Result larger than 43 bits and positive
28  A3   Result larger than 43 bits and positive
27  A1   Result larger than 43 bits and negative
26  A2   Result larger than 43 bits and negative
25  A3   Result larger than 43 bits and negative
24  B1   Value negative(lm=1) or larger than 15 bits(lm=0)
23  B2   Value negative(lm=1) or larger than 15 bits(lm=0)
22  B3   Value negative(lm=1) or larger than 15 bits(lm=0)
21  C1   Value negative or larger than 8 bits.
20  C2   Value negative or larger than 8 bits.
19  C3   Value negative or larger than 8 bits.
18  D    Value negative or larger than 16 bits.
17  E    Divide overflow. (quotient > 2.0)
16  F    Result larger than 31 bits and positive.
15  F    Result larger than 31 bits and negative.
14  G1   Value larger than 10 bits.
13  G2   Value larger than 10 bits.
12  H    Value negative or larger than 12 bits.


--------------------------------------------------------------------------
RTPS     15       Perspective transformation          
Fields:  none
Opcode:  cop2 $0180001

In:      V0       Vector to transform.                         [1,15,0]
         R        Rotation matrix                              [1,3,12]
         TR       Translation vector                           [1,31,0]
         H        View plane distance                          [0,16,0]
         DQA      Depth que interpolation values.              [1,7,8]
         DQB                                                   [1,7,8]
         OFX      Screen offset values.                        [1,15,16]
         OFY                                                   [1,15,16]
Out:     SXY fifo Screen XY coordinates.(short)                [1,15,0]
         SZ fifo  Screen Z coordinate.(short)                  [0,16,0]
         IR0      Interpolation value for depth queing.        [1,3,12]
         IR1      Screen X (short)                             [1,15,0]
         IR2      Screen Y (short)                             [1,15,0]
         IR3      Screen Z (short)                             [1,15,0]
         MAC1     Screen X (long)                              [1,31,0]
         MAC2     Screen Y (long)                              [1,31,0]
         MAC3     Screen Z (long)                              [1,31,0]

Calculation:
[1,31,0] MAC1=A1[TRX + R11*VX0 + R12*VY0 + R13*VZ0]            [1,31,12]
[1,31,0] MAC2=A2[TRY + R21*VX0 + R22*VY0 + R23*VZ0]            [1,31,12]
[1,31,0] MAC3=A3[TRZ + R31*VX0 + R32*VY0 + R33*VZ0]            [1,31,12]
[1,15,0] IR1= Lm_B1[MAC1]                                      [1,31,0]
[1,15,0] IR2= Lm_B2[MAC2]                                      [1,31,0]
[1,15,0] IR3= Lm_B3[MAC3]                                      [1,31,0]
         SZ0<-SZ1<-SZ2<-SZ3
[0,16,0] SZ3= Lm_D(MAC3)                                       [1,31,0]
         SX0<-SX1<-SX2, SY0<-SY1<-SY2
[1,15,0] SX2= Lm_G1[F[OFX + IR1*(H/SZ)]]                       [1,27,16]
[1,15,0] SY2= Lm_G2[F[OFY + IR2*(H/SZ)]]                       [1,27,16]
[1,31,0] MAC0= F[DQB + DQA * (H/SZ)]                           [1,19,24]
[1,15,0] IR0= Lm_H[MAC0]                                       [1,31,0]

Notes:
Z values are limited downwards at 0.5 * H. For smaller z values you'll have
write your own routine.
--------------------------------------------------------------------------
RTPT     23       Perspective Transformation on 3 points.
Fields   none
opcode   cop2 $0280030

in       V0       Vector to transform.                         [1,15,0]
         V1                                                    [1,15,0]
         V2                                                    [1,15,0]
         R        Rotation matrix                              [1,3,12]
         TR       Translation vector                           [1,31,0]
         H        View plane distance                          [0,16,0]
         DQA      Depth que interpolation values.              [1,7,8]
         DQB                                                   [1,7,8]
         OFX      Screen offset values.                        [1,15,16]
         OFY                                                   [1,15,16]
out      SXY fifo Screen XY coordinates.(short)                [1,15,0]
         SZ fifo  Screen Z coordinate.(short)                  [0,16,0]
         IR0      Interpolation value for depth queing.        [1,3,12]
         IR1      Screen X (short)                             [1,15,0]
         IR2      Screen Y (short)                             [1,15,0]
         IR3      Screen Z (short)                             [1,15,0]
         MAC1     Screen X (long)                              [1,31,0]
         MAC2     Screen Y (long)                              [1,31,0]
         MAC3     Screen Z (long)                              [1,31,0]

Calculation: Same as RTPS, but repeats for V1 and V2.
--------------------------------------------------------------------------
MVMVA    8        Multiply vector by matrix and vector addition.
Fields:  sf,mx,v,cv,lm
Opcode:  cop2 $0400012

in:      V0/V1/V2/IR       Vector v0, v1, v2 or [IR1,IR2,IR3]
         R/LLM/LCM         Rotation, light or color matrix.    [1,3,12]
         TR/BK             Translation or background color vector.
out:     [IR1,IR2,IR3]     Short vector
         [MAC1,MAC2,MAC3]  Long vector

Calculation:
MX = matrix specified by mx
V = vector specified by v
CV = vector specified by cv


         MAC1=A1[CV1 + MX11*V1 + MX12*V2 + MX13*V3]
         MAC2=A2[CV2 + MX21*V1 + MX22*V2 + MX23*V3]
         MAC3=A3[CV3 + MX31*V1 + MX32*V2 + MX33*V3]
         IR1=Lm_B1[MAC1]
         IR2=Lm_B2[MAC2]
         IR3=Lm_B3[MAC3]

Notes:
The cv field allows selection of the far color vector, but this vector
is not added correctly by the GTE.
--------------------------------------------------------------------------
DCPL     8        Depth Cue Color light
Fields:  none
Opcode:  cop2 $0680029
In:      RGB               Primary color.         R,G,B,CODE   [0,8,0]
         IR0               interpolation value.                [1,3,12]
         [IR1,IR2,IR3]     Local color vector.                 [1,3,12]
         CODE              Code value from RGB.           CODE [0,8,0]
         FC                Far color.                          [1,27,4]
Out:     RGBn              RGB fifo               Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:
[1,27,4]  MAC1=A1[R*IR1 + IR0*(Lm_B1[RFC - R * IR1])]          [1,27,16]
[1,27,4]  MAC2=A2[G*IR2 + IR0*(Lm_B1[GFC - G * IR2])]          [1,27,16]
[1,27,4]  MAC3=A3[B*IR3 + IR0*(Lm_B1[BFC - B * IR3])]          [1,27,16]
[1,11,4]  IR1=Lm_B1[MAC1]                                      [1,27,4]
[1,11,4]  IR2=Lm_B2[MAC2]                                      [1,27,4]
[1,11,4]  IR3=Lm_B3[MAC3]                                      [1,27,4]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
DPCS     8        Depth Cueing.
Fields:  none
Opcode:  cop2 $0780010

In:      IR0               Interpolation value                 [1,3,12]
         RGB               Color                  R,G,B,CODE   [0,8,0]
         FC                Far color              RFC,GFC,BFC  [1,27,4]
Out:     RGBn              RGB fifo               Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculations:
[1,27,4]  MAC1=A1[(R + IR0*(Lm_B1[RFC - R])]                   [1,27,16][lm=0]
[1,27,4]  MAC2=A2[(G + IR0*(Lm_B1[GFC - G])]                   [1,27,16][lm=0]
[1,27,4]  MAC3=A3[(B + IR0*(Lm_B1[BFC - B])]                   [1,27,16][lm=0]
[1,11,4]  IR1=Lm_B1[MAC1]                                      [1,27,4][lm=0]
[1,11,4]  IR2=Lm_B2[MAC2]                                      [1,27,4][lm=0]
[1,11,4]  IR3=Lm_B3[MAC3]                                      [1,27,4][lm=0]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
INTPL    8        Interpolation of a vector and far color vector.
Fields:  none
Opcode:  cop2 $0980011

In:      [IR1,IR2,IR3]     Vector                              [1,3,12]
         IR0               Interpolation value                 [1,3,12]
         CODE              Code value from RGB.           CODE [0,8,0]
         FC                Far color              RFC,GFC,BFC  [1,27,4]
Out:     RGBn              RGB fifo               Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculations:
[1,27,4]  MAC1=A1[IR1 + IR0*(Lm_B1[RFC - IR1])]                [1,27,16]
[1,27,4]  MAC2=A2[IR2 + IR0*(Lm_B1[GFC - IR2])]                [1,27,16]
[1,27,4]  MAC3=A3[IR3 + IR0*(Lm_B1[BFC - IR3])]                [1,27,16]
[1,11,4]  IR1=Lm_B1[MAC1]                                      [1,27,4]
[1,11,4]  IR2=Lm_B2[MAC2]                                      [1,27,4]
[1,11,4]  IR3=Lm_B3[MAC3]                                      [1,27,4]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
SQR      5        Square vector.
Fields:  sf
Opcode:  cop2 $0a00428
                                                       sf=0    sf=1
in:      [IR1,IR2,IR3]     vector                      [1,15,0][1,3,12]
out:     [IR1,IR2,IR3]     vector^2                    [1,15,0][1,3,12]
         [MAC1,MAC2,MAC3]  vector^2                    [1,31,0][1,19,12]

Calculation: (left format sf=0, right format sf=1)

[1,31,0][1,19,12] MAC1=A1[IR1*IR1]                     [1,43,0][1,31,12]
[1,31,0][1,19,12] MAC2=A2[IR2*IR2]                     [1,43,0][1,31,12]
[1,31,0][1,19,12] MAC3=A3[IR3*IR3]                     [1,43,0][1,31,12]
[1,15,0][1,3,12]  IR1=Lm_B1[MAC1]                      [1,31,0][1,19,12][lm=1]
[1,15,0][1,3,12]  IR2=Lm_B2[MAC2]                      [1,31,0][1,19,12][lm=1]
[1,15,0][1,3,12]  IR3=Lm_B3[MAC3]                      [1,31,0][1,19,12][lm=1]
--------------------------------------------------------------------------
NCS      14       Normal color
Fields:  none
Opcode:  cop2 $0C8041E

In:      V0                Normal vector                       [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         CODE              Code value from RGB.           CODE [0,8,0]
         LCM               Color matrix                        [1,3,12]
         LLM               Light matrix                        [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

[1,19,12] MAC1=A1[L11*VX0 + L12*VY0 + L13*VZ0]                 [1,19,24]
[1,19,12] MAC2=A2[L21*VX0 + L22*VY0 + L23*VZ0]                 [1,19,24]
[1,19,12] MAC3=A3[L31*VX0 + L32*VY0 + L33*VZ0]                 [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[1,19,12] MAC1=A1[RBK + LR1*IR1 + LR2*IR2 + LR3*IR3]           [1,19,24]
[1,19,12] MAC2=A2[GBK + LG1*IR1 + LG2*IR2 + LG3*IR3]           [1,19,24]
[1,19,12] MAC3=A3[BBK + LB1*IR1 + LB2*IR2 + LB3*IR3]           [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
NCT      30       Normal color
Fields:  none
Opcode:  cop2 $0D80420

In:      V0,V1,V2          Normal vector                       [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         CODE              Code value from RGB.           CODE [0,8,0]
         LCM               Color matrix                        [1,3,12]
         LLM               Light matrix                        [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation: Same as NCS, but repeated for V1 and V2.
--------------------------------------------------------------------------
NCDS     19       Normal color depth cue single vector
Fields:  none
Opcode:  cop2 $0e80413
In:      V0                Normal vector                       [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         LLM               Light matrix                        [1,3,12]
         LCM               Color matrix                        [1,3,12]
         IR0               Interpolation value                 [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:
[1,19,12] MAC1=A1[L11*VX0 + L12*VY0 + L13*VZ0]                 [1,19,24]
[1,19,12] MAC2=A1[L21*VX0 + L22*VY0 + L23*VZ0]                 [1,19,24]
[1,19,12] MAC3=A1[L31*VX0 + L32*VY0 + L33*VZ0]                 [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[1,19,12] MAC1=A1[RBK + LR1*IR1 + LR2*IR2 + LR3*IR3]           [1,19,24]
[1,19,12] MAC2=A1[GBK + LG1*IR1 + LG2*IR2 + LG3*IR3]           [1,19,24]
[1,19,12] MAC3=A1[BBK + LB1*IR1 + LB2*IR2 + LB3*IR3]           [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[1,27,4]  MAC1=A1[R*IR1 + IR0*(Lm_B1[RFC-R*IR1])]              [1,27,16][lm=0]
[1,27,4]  MAC2=A1[G*IR2 + IR0*(Lm_B2[GFC-G*IR2])]              [1,27,16][lm=0]
[1,27,4]  MAC3=A1[B*IR3 + IR0*(Lm_B3[BFC-B*IR3])]              [1,27,16][lm=0]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,27,4][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,27,4][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,27,4][lm=1]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
NCDT     44       Normal color depth cue triple vectors
Fields:  none
Opcode:  cop2 $0f80416
In:      V0                Normal vector                       [1,3,12]
         V1                Normal vector                       [1,3,12]
         V2                Normal vector                       [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         FC                Far color              RFC,GFC,BFC  [1,27,4]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         LLM               Light matrix                        [1,3,12]
         LCM               Color matrix                        [1,3,12]
         IR0               Interpolation value                 [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:
Same as NCDS but repeats for v1 and v2.
--------------------------------------------------------------------------
DPCT     17       Depth Cueing.
Fields:  none
Opcode:  cop2 $0F8002A

In:      IR0               Interpolation value                 [1,3,12]
         RGB0,RGB1,RGB2    Colors in RGB fifo.    Rn,Gn,Bn,CDn [0,8,0]
         FC                Far color              RFC,GFC,BFC  [1,27,4]
Out:     RGBn              RGB fifo               Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculations:
[1,27,4]  MAC1=A1[R0+ IR0*(Lm_B1[RFC - R0])]                   [1,27,16][lm=0]
[1,27,4]  MAC2=A2[G0+ IR0*(Lm_B1[GFC - G0])]                   [1,27,16][lm=0]
[1,27,4]  MAC3=A3[B0+ IR0*(Lm_B1[BFC - B0])]                   [1,27,16][lm=0]
[1,11,4]  IR1=Lm_B1[MAC1]                                      [1,27,4][lm=0]
[1,11,4]  IR2=Lm_B2[MAC2]                                      [1,27,4][lm=0]
[1,11,4]  IR3=Lm_B3[MAC3]                                      [1,27,4][lm=0]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]

Performs this calculation 3 times, so all three RGB values have been
replaced by the depth cued RGB values.

--------------------------------------------------------------------------
NCCS     17       Normal Color Color single vector
Fields:  none
Opcode:  cop2 $108041B

In:      V0                Normal vector                       [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         LLM               Light matrix                        [1,3,12]
         LCM               Color matrix                        [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:

[1,19,12] MAC1=A1[L11*VX0 + L12*VY0 + L13*VZ0]                  [1,19,24]
[1,19,12] MAC2=A2[L21*VX0 + L22*VY0 + L23*VZ0]                  [1,19,24]
[1,19,12] MAC3=A3[L31*VX0 + L32*VY0 + L33*VZ0]                  [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                      [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                      [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                      [1,19,12][lm=1]
[1,19,12] MAC1=A1[RBK + LR1*IR1 + LR2*IR2 + LR3*IR3]            [1,19,24]
[1,19,12] MAC2=A2[GBK + LG1*IR1 + LG2*IR2 + LG3*IR3]            [1,19,24]
[1,19,12] MAC3=A3[BBK + LB1*IR1 + LB2*IR2 + LB3*IR3]            [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                      [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                      [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                      [1,19,12][lm=1]
[1,27,4]  MAC1=A1[R*IR1]                                        [1,27,16]
[1,27,4]  MAC2=A2[G*IR2]                                        [1,27,16]
[1,27,4]  MAC3=A3[B*IR3]                                        [1,27,16]
[1,3,12]  IR1= Lm_B1[MAC1]                                      [1,27,4][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                      [1,27,4][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                      [1,27,4][lm=1]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                              [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                              [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                              [1,27,4]
--------------------------------------------------------------------------
NCCT     39       Normal Color Color triple vector
Fields:  none
Opcode:  cop2 $118043F

In:      V0                Normal vector 1                     [1,3,12]
         V1                Normal vector 2                     [1,3,12]
         V2                Normal vector 3                     [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         LLM               Light matrix                        [1,3,12]
         LCM               Color matrix                        [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:
Same as NCCS but repeats for v1 and v2.
--------------------------------------------------------------------------
CDP      13       Color Depth Que
Fields:  none
Opcode:  cop2 $1280414

In:      [IR1,IR2,IR3]     Vector                              [1,3,12]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         IR0               Interpolation value                 [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         LCM               Color matrix                        [1,3,12]
         FC                Far color              RFC,GFC,BFC  [1,27,4]
Out:     RGBn              RGB fifo               Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculation:
[1,19,12] MAC1=A1[RBK + LR1*IR1 + LR2*IR2 + LR3*IR3]           [1,19,24]
[1,19,12] MAC2=A2[GBK + LG1*IR1 + LG2*IR2 + LG3*IR3]           [1,19,24]
[1,19,12] MAC3=A3[BBK + LB1*IR1 + LB2*IR2 + LB3*IR3]           [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[1,27,4]  MAC1=A1[R*IR1 + IR0*(Lm_B1[RFC-R*IR1])]              [1,27,16][lm=0]
[1,27,4]  MAC2=A2[G*IR2 + IR0*(Lm_B2[GFC-G*IR2])]              [1,27,16][lm=0]
[1,27,4]  MAC3=A3[B*IR3 + IR0*(Lm_B3[BFC-B*IR3])]              [1,27,16][lm=0]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,27,4][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,27,4][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,27,4][lm=1]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
CC       11       Color Color.
Fields:  none
Opcode:  cop2 $138041C
In:      [IR1,IR2,IR3]     Vector                              [1,3,12]
         BK                Background color       RBK,GBK,BBK  [1,19,12]
         RGB               Primary color          R,G,B,CODE   [0,8,0]
         LCM               Color matrix                        [1,3,12]
Out:     RGBn              RGB fifo.              Rn,Gn,Bn,CDn [0,8,0]
         [IR1,IR2,IR3]     Color vector                        [1,11,4]
         [MAC1,MAC2,MAC3]  Color vector                        [1,27,4]

Calculations:
[1,19,12] MAC1=A1[RBK + LR1*IR1 + LR2*IR2 + LR3*IR3]           [1,19,24]
[1,19,12] MAC2=A2[GBK + LG1*IR1 + LG2*IR2 + LG3*IR3]           [1,19,24]
[1,19,12] MAC3=A3[BBK + LB1*IR1 + LB2*IR2 + LB3*IR3]           [1,19,24]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,19,12][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,19,12][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,19,12][lm=1]
[1,27,4]  MAC1=A1[R*IR1]                                       [1,27,16]
[1,27,4]  MAC2=A2[G*IR2]                                       [1,27,16]
[1,27,4]  MAC3=A3[B*IR3]                                       [1,27,16]
[1,3,12]  IR1= Lm_B1[MAC1]                                     [1,27,4][lm=1]
[1,3,12]  IR2= Lm_B2[MAC2]                                     [1,27,4][lm=1]
[1,3,12]  IR3= Lm_B3[MAC3]                                     [1,27,4][lm=1]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]                             [1,27,4]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]                             [1,27,4]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]                             [1,27,4]
--------------------------------------------------------------------------
NCLIP    8        Normal clipping
Fields:
Opcode:  cop2 $1400006

in:      SXY0,SXY1,SXY2    Screen coordinates                  [1,15,0]
out:     MAC0              Outerproduct of SXY1 and SXY2 with  [1,31,0]
                           SXY0 as origin.

Calculation:
[1,31,0] MAC0 = F[SX0*SY1+SX1*SY2+SX2*SY0-SX0*SY2-SX1*SY0-SX2*SY1] [1,43,0]
--------------------------------------------------------------------------
AVSZ3    5        Average of three Z values
fields:
Opcode:  cop2 $158002D

in:      SZ1, SZ2, SZ3     Z-Values                            [0,16,0]
         ZSF3              Divider                             [1,3,12]
out:     OTZ               Average.                            [0,16,0]
         MAC0              Average.                            [1,31,0]

Calculation:
[1,31,0] MAC0=F[ZSF3*SZ1 + ZSF3*SZ2 + ZSF3*SZ3]                [1,31,12]
[0,16,0] OTZ=Lm_D[MAC0]                                        [1,31,0]
--------------------------------------------------------------------------
AVSZ4    6        Average of four Z values
Fields:
Opcode:  cop2 $168002E

in:      SZ1,SZ2,SZ3,SZ4   Z-Values                            [0,16,0]
         ZSF4              Divider                             [1,3,12]
out:     OTZ               Average.                            [0,16,0]
         MAC0              Average.                            [1,31,0]

Calculation:
[1,31,0] MAC0=F[ZSF4*SZ0 + ZSF4*SZ1 + ZSF4*SZ2 + ZSF4*SZ3]     [1,31,12]
[0,16,0] OTZ=Lm_D[MAC0]                                        [1,31,0]
--------------------------------------------------------------------------
OP       6        Outer product of 2 vectors
Fields:  sf
Opcode:  cop2 $170000C

in:      [R11R12,R22R23,R33] vector 1
         [IR1,IR2,IR3]      vector 2
out:     [IR1,IR2,IR3]      outer product
         [MAC1,MAC2,MAC3]   outer product

Calculation: (D1=R11R12,D2=R22R23,D3=R33)

         MAC1=A1[D2*IR3 - D3*IR2]
         MAC2=A2[D3*IR1 - D1*IR3]
         MAC3=A3[D1*IR2 - D2*IR1]
         IR1=Lm_B1[MAC0]
         IR2=Lm_B2[MAC1]
         IR3=Lm_B3[MAC2]

--------------------------------------------------------------------------
GPF      5        General purpose interpolation
Fields:  sf
Opcode:  cop2 $190003D

in:      IR0               scaling factor
         CODE              code field of RGB
         [IR1,IR2,IR3]     vector
out:     [IR1,IR2,IR3]     vector
         [MAC1,MAC2,MAC3]  vector
         RGB2              RGB fifo.

Calculation:

         MAC1=A1[IR0 * IR1]
         MAC2=A2[IR0 * IR2]
         MAC3=A3[IR0 * IR3]
         IR1=Lm_B1[MAC1]
         IR2=Lm_B2[MAC2]
         IR3=Lm_B3[MAC3]
[0,8,0]   Cd0<-Cd1<-Cd2<- CODE
[0,8,0]   R0<-R1<-R2<- Lm_C1[MAC1]
[0,8,0]   G0<-G1<-G2<- Lm_C2[MAC2]
[0,8,0]   B0<-B1<-B2<- Lm_C3[MAC3]
--------------------------------------------------------------------------
GPL      5        General purpose interpolation
Fields:  sf
Opcode:  cop2 $1A0003E

in:      IR0               scaling factor
         CODE              code field of RGB
         [IR1,IR2,IR3]     vector
         [MAC1,MAC2,MAC3]  vector
out:     [IR1,IR2,IR3]     vector
         [MAC1,MAC2,MAC3]  vector
         RGB2              RGB fifo.

Calculation:

         MAC1=A1[MAC1 + IR0 * IR1]
         MAC2=A2[MAC2 + IR0 * IR2]
         MAC3=A3[MAC3 + IR0 * IR3]
         IR1=Lm_B1[MAC1]
         IR2=Lm_B2[MAC2]
         IR3=Lm_B3[MAC3]
[0,8,0]  Cd0<-Cd1<-Cd2<- CODE
[0,8,0]  R0<-R1<-R2<- Lm_C1[MAC1]
[0,8,0]  G0<-G1<-G2<- Lm_C2[MAC2]
[0,8,0]  B0<-B1<-B2<- Lm_C3[MAC3]
--------------------------------------------------------------------------
Field decriptions.

bit |24 23 22 21 20|19|18 17|16 15|14 13|12 11|10|
desc|              |sf|mx   |v    |cv   |     |lm|

bit |09 08 07 06 05 04 03 02 01 00|
desc|                             |

sf 0  Normal calculation.
   1  Calculations on data shifted 12 bits to the left in the IR regs.
(Not entirely sure about what really happens.)

mx 0  Multiply with rotation matrix
   1  Multiply with light matrix
   2  Multiply with color matrix
   3  -

v  0  V0 source vector (short)
   1  V1 source vector (short)
   2  V2 source vector (short)
   3  IR source vector (long)

cv 0  Add translation vector (TR)
   1  Add back color vector  (BK)
   2  Bugged. Should add far color vector. (FC)
   3  Add no vector

lm 0  No negative limit.
   1  Limit negative results to 0.

--------------------------------------------------------------------------
A list of common MVMVA instructions:

rtv0     cop2 $0486012  v0 * rotmatrix
rtv1     cop2 $048E012  v1 * rotmatrix
rtv2     cop2 $0496012  v2 * rotmatrix

rtir12   cop2 $049E012  ir * rotmatrix
rtir0    cop2 $041E012  ir * rotmatrix.

rtv0tr   cop2 $0480012  v0 * rotmatrix + tr vector
rtv1tr   cop2 $0488012  v1 * rotmatrix + tr vector
rtv2tr   cop2 $0490012  v2 * rotmatrix + tr vector
rtirtr   cop2 $0498012  ir * rotmatrix + tr vector

rtv0bk   cop2 $0482012  v0 * rotmatrix + bk vector
rtv1bk   cop2 $048A012  v1 * rotmatrix + bk vector
rtv2bk   cop2 $0492012  v2 * rotmatrix + bk vector
rtirbk   cop2 $049A012  ir * rotmatrix + bk vector

ll       cop2 $04A6412  v0 * light matrix. Lower limit result to 0.

llv0     cop2 $04A6012  v0 * light matrix
llv1     cop2 $04AE012  v1 * light matrix
llv2     cop2 $04B6012  v2 * light matrix
llir     cop2 $04BE012  ir * light matrix

llv0tr   cop2 $04A0012  v0 * light matrix + tr vector
llv1tr   cop2 $04A8012  v1 * light matrix + tr vector
llv2tr   cop2 $04B0012  v2 * light matrix + tr vector
llirtr   cop2 $04B8012  ir * light matrix + tr vector

llv0bk   cop2 $04A2012  v0 * light matrix + bk vector
llv1bk   cop2 $04AA012  v1 * light matrix + bk vector
llv2bk   cop2 $04B2012  v2 * light matrix + bk vector
llirbk   cop2 $04BA012  ir * light matrix + bk vector

lc       cop2 $04DA412

lcv0     cop2 $04C6012  v0 * color matrix
lcv1     cop2 $04CE012  v1 * color matrix
lcv2     cop2 $04D6012  v2 * color matrix
lcir     cop2 $04DE012  ir * color matrix

lcv0tr   cop2 $04C0012  v0 * color matrix + tr vector
lcv1tr   cop2 $04C8012  v1 * color matrix + tr vector
lcv2tr   cop2 $04D0012  v2 * color matrix + tr vector
lcirtr   cop2 $04D8012  ir * color matrix + tr vector

lcv0bk   cop2 $04C2012  v0 * color matrix + bk vector
lcv1bk   cop2 $04CA012  v1 * color matrix + bk vector
lcv2bk   cop2 $04D2012  v2 * color matrix + bk vector
lcirbk   cop2 $04DA012  ir * color matrix + bk vector

Other instructions:

sqr12    cop2 $0A80428  square of ir  (1,19,12)
sqr0     cop2 $0A00428                (1,31, 0)

op12     cop2 $178000C  outer product (1,19,12)
op0      cop2 $170000C                (1,31, 0)

gpf12    cop2 $198003D  general purpose interpolation (1,19,12)
gpf0     cop2 $190003D                                (1,31, 0)

gpl12    cop2 $1A8003E  general purpose interpolation (1,19,12)
gpl0     cop2 $1A0003E                                (1,31, 0)

--------------------------------------------------------------------------
doomed@c64.org <- corrections/additions     latest update -> psx.rules.org
--------------------------------------------------------------------------
 8/jun/1999       Initial version.
23/aug/1999       Almost completely rewritten.
 2/feb/2000	  Small fix.
--------------------------------------------------------------------------
If you miss anything that was in the previous version please mail me.
--------------------------------------------------------------------------

